/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package prueba3;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author homelinux
 */
public class Prueba3 {

    private static String ruta="C:\\clientes.dat";
    
    private static int leeOpcion(){
            int nOpcion = 10;
            
            try{
                BufferedReader lect = new BufferedReader(new InputStreamReader(System.in));
                //leera desde el teclado la opcion
                String cOpcion = lect.readLine();
                
                nOpcion = Integer.parseInt(cOpcion);
                }catch(NumberFormatException e){
                    System.err.println("No es un número válido, vuelve a intentarlo.");}
                 catch(IOException ex){
                    System.err.println("No es un número válido, vuelve a intentarlo.");}
            
            return (nOpcion);
    }
            
    //comienzo del main
    public static void main(String[] args)throws FileNotFoundException, IOException {
        
        boolean seguir = true;
        
        while (seguir){
            System.out.println("Seleciona una opción");
            
            System.out.println("[1] Añdir cliente.");
            System.out.println("[2] Listar clientes.");
            System.out.println("[3] Buscar clientes.");
            System.out.println("[4] Borrar clientes.");
            System.out.println("[5] Borrar fichero de clientes completamente.");
            System.out.println("[6] Salir.");
            
            System.out.println("Seleciona una opción");
            int selec = 0;
            selec = leeOpcion();
            
            //dependiendo del tipo de seleccion obtendremos
            switch (selec){
                case 1: agregaCliente();
                    break;
                case 2: listaClientes();
                    break;
                case 3: buscaCliente();
                    break;
                case 4: borraCliente();
                    break;
                case 5: borrarFichero();
                    break;
                case 6: 
                    seguir = false;
                    break;
                default:
                    System.out.println("Selecciona una opción válida.");
                    
            }
            
        }
        
    }
    
    private static void borrarFichero(){
        //metodo privado para borrar fichero
        File f = new File(ruta);
        boolean success = f.delete();
        if(success)
            System.out.println("Borrado OK.");
        else
            System.out.println("El borrado no ha sido posible.");
    }
    
    //borrado de cliente
    private static void borrarCliente(){
        Clientes cliente = null;
        List listaContinente;
        listaContinente = new ArrayList();
        boolean salir = false;
        FileInputStream fiCliLec;
        ObjectInputStream fluent;
        
        try{
        BufferedReader lect = new BufferedReader(new InputStreamReader(System.in));
        
        //leemos desde el teclado el nif
        System.out.println("Escribe el nif del cliente que quieres borrar.");
        String elNif = lect.readLine();
        fiCliLec = new FileInputStream(ruta);
        fluent = new ObjectInputStream(fiCliLec);
        
        do{
            //leeremos el objeto del fichero
            try{
                cliente = (Clientes)fluent.readObject();
            }catch(Exception ex){
                salir = true;
            }
            
        if(cliente != null){
            //condicion de equals para comprobar el introducido con el de la lista que tengamos
            if(cliente.getNif().equals(elNif))
                System.out.println("El cliente ha eliminar no se ha encontrado.");
            else
                //ahora vamos a añadirlo a la lista de clientes
                if(salir == false)
                    listaContinente.add(cliente);
        }
        else 
            salir = true;
        }while((cliente != null)&&(salir == false));
        
        //cerramos
        fiCliLec.close();
        fluent.close();
        
        //escribimkos todos menos el que queremos a un fichero
        escribeLista(listaContinente);
        
        //if(listaContinente.isEmpty())
            //System.out.println("La lista está vacia");
        //else
            //System.out.println("La lista no está vacia");
        }catch(FileNotFoundException e){
            System.out.println(e.getMessage);
        }catch(Exception ex){
            System.out.println(ex.getMessage);
            System.out.println("Capturada");
        }finally{
            //Actividades que siempre ocurren
            
        }
    }
    
    //escribir la lista
    private static void escribeLista(List lista){
        Iterator<Clientes> cli = lista.iterator();
        ObjectOutputStream flusal;
        
        try{
            //creamos un fichero temporal
            File temp = File.createTempFile("tempo", ".tmp");
            FileOutputStream ficlisal = new FileOutputStream(temp);
            //y mientras haya clientes
            while(cli.hasNext()){
                //obtenemos el cliente
                Clientes elCliente = cli.next();
                
                //System.out.println("y el nombre es: "+elCliente.getNombre());
                flusal = new ObjectOutputStream(ficlisal);
                
                //ahora se escribira en el fichero
                if(flusal != null){
                    flusal.writeObject(elCliente);
                    System.out.println("Se está escribiendo en el f. temporal"+elCliente.getNombre());
                }
            }
            //cerramos
            ficlisal.close();
            
            //borramos el fichero de clientes
            borrarFichero();
            
            //renombrar el fichero actual con el nombre de clilentes.dat
            File nuevoF = new File(ruta);
            boolean correcto = temp.renameTo(nuevoF);
            if(correcto)
                System.out.println("El renombrado a Clientes.dat ha sido correcto.");
            else
                System.out.println("El renombrado no ha sido posible.");
           }catch(IOException ex){
               System.out.println("Ha habido un problema en el renombrado del fichero.");
           }
    }
    
    //añadir cliente
    private static void agregaCliente(){
        BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));
        FileOutputStream ficli;
        ObjectOutputStream flusal;
        try{
            String nombre;
            String telefono;
            String direccion;
            String nif;
            
            //leer desde el teclado el nif
            System.out.println("Escribe el nif del cliente: ");
            nif = lectura.readLine();
            
            //leer desde el teclado el nombre
            System.out.println("Escribe el nombre del cliente: ");
            nombre = lectura.readLine();
            //ajustar el tamaño de la cadena de caracteres
            nombre = ajustaTexto(nombre);
            
            //leer desde el teclado el telefono
            System.out.println("Escribe el telefono del cliente: ");
            telefono = lectura.readLine();
            //ajustar el tamaño de la cadena de caracteres
            telefono = ajustaTexto(telefono);
            
            //leer desde el teclado el direccion
            System.out.println("Escribe la direccion del cliente: ");
            direccion = lectura.readLine();
            //ajustar el tamaño de la cadena de caracteres
            direccion = ajustaTexto(direccion);
            
            //leer desde el teclado el deuda
            System.out.println("Escribe la deuda del cliente: ");
            String varDeuda = lectura.readLine();
            
            //creamos un nuevo objeto cliente
            Clientes nuevoCli = new Clientes();
            nuevoCli.setNif(nif);
            nuevoCli.setNombre(nombre);
            nuevoCli.setTelefono(telefono);
            nuevoCli.setDirección(direccion);
            nuevoCli.setDeuda(varDeuda);
            
            //guardar en el fichero el nuevo cliente
            //primero abrimos el fichero
            ficli = new FileOutputStream(ruta,true);
            
            //si el fichero ya tiene registros
            if(tieneRegistros())
                //se usa esta redefinicion de la clase para
                //evitar que escriba datos de la cabecera que corromperan
                //la posterior lectura del fichero
                flusal = new MiObjectOutputStream(ficli);
            else
                flusal = new ObjectOutputStream(ficli);
            
            //ahora se escribe
            if(flusal != null)
                flusal.writeObject(nuevoCli);
            
            //cerramos
            flusal.close();
            ficli.close();
            
        }catch(IOException ex){
            Logger.getLogger(serializaCli.class.getName()).log(Level.SEVERE,null,ex);
        }
    
}
    //funcion para ajustar la cadena al tamaño 10 de longitud
    private static String ajustaTexto(String cadena){
        if(cadena.length() < 10)
            return (String.format("%1$-10s", cadena));
        else
            return (cadena.substring(0,10));
    }
    
    public static boolean esNumero (String cadena){
        try{
            Float.parseFloat(cadena);
            return true;
        }catch(NumberFormatException nfe){
            return false;
        }
    }
    
    private static void listaClientes()throws FileNotFoundException,IOException{
        File f = new File(ruta);
        boolean existe = f.exists();
        if(existe){
            Clientes cliente = null;
            
            FileInputStream fiCliLec;
            ObjectInputStream fluent;
            
            fiCliLec = new FileInputStream(ruta);
            fluent = new ObjectInputStream(fiCliLec);
            //revisa los try uno se puede quitar
            try{
                try{
                    do{
                        //leer el objeto del fichero
                        cliente = (Clientes)fluent.readObject();
                        System.out.println(cliente.getNif());
                        System.out.println(cliente.getNombre());
                        System.out.println(cliente.getDirección());
                        System.out.println(cliente.getTelefono());
                        System.out.println(cliente.getDeuda());
                        
                    }while(cliente != null);
                    
                    fiCliLec.close();
                    fluent.close();
                    
                }catch(FileNotFoundException e){
                    System.out.println(e.getCause());
                }catch(Exception ex){
                    System.out.println(ex.getMessage());
                }
            }
        }
    }
    
}
